// clang-format off

#ifndef PICIMAGE_H
#define PICIMAGE_H

#include <QMenu>
#include <QWidget>
#include <amimagepreivew.h>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QTemporaryFile>

QT_BEGIN_NAMESPACE
namespace Ui {
class PicImage;
}

class PicImage : public QWidget
{
    Q_OBJECT

public:
    enum MenuRole {
        ShowAdd      = 0x00000001,
        ShowDel      = 0x00000002,

        ShowAddFromClip = 0x00000004,
    };
    Q_DECLARE_FLAGS(MenuRoles, MenuRole)

    explicit PicImage(QWidget *parent = nullptr, MenuRoles role = ShowDel);
    ~PicImage();

    /**
     * @brief setImage
     * @param picImage
     * 该函数在用于仅预览时并且不存储图片路径时使用，不过也提供了 isEmptyPath 用于判断内容
     */
    void setImage(const QPixmap &picImage, bool isTemporary = false);
    QPixmap getImage();
    void setImagePath(const QString &picPath);
    QString getImagePath() const;

    // 判断当前是否有显示图片或使用了路径
    bool isEmptyImage();
    bool isEmptyPath();

    void setMenuRole(PicImage::MenuRoles roles);

    // 判断当前显示的是否是远程或本地图片
    // 如果需要使用此处函数，强烈建议与 isEmptyPath() 配合使用
    bool isRemoteImage();
    bool isLocalImage();

    // 用于内部的简单的工具函数
    bool isRemoteFile(const QString &urlorfilepath); // prefix: http or ...
    bool isLocalFile(const QString &urlorfilepath); // prefix: http or ...

    void clean(bool emitDeleted = false);

    // 判断当前远程图片是否可被读取，如果需要使用此处函数，强烈建议与 isRemoteImage() 配合使用
    bool getRemoteReadyRead() const;
    void setRemoteReadyRead(bool value);

    // 判断当前远程图片是否可被读取，如果需要使用此处函数，强烈建议与 isRemoteImage() getRemoteReadyRead() 配合使用
    bool getRemoteFetching() const;
    void setRemoteFetching(bool value);

    // 扩展的外部活动菜单(指为该控件添加的外部实现的 QAction)
    void appendExternalActionData(QAction *action, int actionData) {
        action->setData(actionData);
        // 当被触发时，将发出外部活动信号，并提供外部给定的该 action 的标志
        connect(action, &QAction::triggered, this, [=](){
            emit picImageExternalActionSignal(action->data().toInt());
        });
        // 扩展活动项添加到剪贴板菜单(投稿器的设计上只配置了 ShowDel | ShowAddFromClip)
        picMenuAddFromClip.addAction(action);
    }

signals:
    void picImageDeleted();
    void picImageRemoteSignal(bool success);
    void picImageClipSignal();
    void picImageExternalActionSignal(int actionId);

private:
    Ui::PicImage *ui;
    QPixmap picImage;
    QString picPath;
    AmImagePreivew picImagePreview;

    QMenu picMenuAdd;
    QMenu picMenuDel;
    QMenu picMenuAddFromClip;

    MenuRoles mRoles;
    QNetworkAccessManager *manager;

    bool remoteReadyRead;
    bool remoteFetching;

    QTemporaryFile tempFile;
    // QWidget interface
protected:
    void mousePressEvent(QMouseEvent *event) override;

private slots:
    void on_transPic_triggered();
    void on_addPic_triggered();
    void on_addFromClip_triggered();
};
Q_DECLARE_OPERATORS_FOR_FLAGS(PicImage::MenuRoles)

#endif // PICIMAGE_H
